package com.mmaingenieria.MMAGestor.controller.usuarios;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.mmaingenieria.MMAGestor.beans.Mensaje;
import com.mmaingenieria.MMAGestor.controller.InitServlet;
import com.mmaingenieria.MMAGestor.enumerations.RolUsuario;
import com.mmaingenieria.MMAGestor.enumerations.TipoMensaje;
import com.mmaingenieria.MMAGestor.listeners.Listener;
import com.mmaingenieria.MMAGestor.utils.Tools;


public class GestionPass extends InitServlet {
	private static final long serialVersionUID = 1L;
           
    public GestionPass() {
        super();
    }

    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		super.doGet(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try{
			super.doPost(request, response, true);//miro si hay usuario logeado.
			if (super.usuarioLogueado){//si hay usuario logeado ejecuto el dopost
				String op_pass = (String)request.getParameter("op_pass");//recojo la opcion con la que viene para saber si tengo que hacer una cosa u otra
				if (op_pass !=null && op_pass.equals("1")){//si mandan la opcion 1 tengo que ir a la ventana de detallePass.jsp con los campos en blanco
					editarPass(request,response, Integer.parseInt(request.getParameter("usuario_id")));
					
				}
				else if (op_pass !=null && op_pass.equals("2")){//si mandan la opcion 2 tengo que cambiar la pass y volver a listar usuarios
					cambiarPass(request, response);
				}
			}else{//si no hay usuario logueado me voy a fin sesion.
				super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_finSesion"));
			}
			super.dispatcher.forward(request, response);			
		}catch (Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada gestionando usuarios");
			try{
				GestionUsuariosServlet gestionUsuarios = new GestionUsuariosServlet();
				gestionUsuarios.mostrarListaUsuarios(request,response);
				super.dispatcher.forward(request, response);
			}catch(Exception e1){				
				super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_error"));//le dirijo a la pagina de error
			    super.dispatcher.forward(request, response);//Le digo que vaya
			}
		}
	}
	
	//Metodo que lleva a la pagina de detallePass.jsp y envia el usuario_id a cambiar la pass
	private void editarPass (HttpServletRequest request, HttpServletResponse response, int _usuario_id) throws Exception{
		try{
			request.setAttribute("usuario_id", _usuario_id);
			super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_detalle_pass"));
			Logger.getLogger(this.getClass()).info("El usuario: " + super.usuarioSesion.getNombre() + " esta editando la password de: " + _usuario_id);
		}catch (Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada al ir a editar una pass");
			throw e;
		}
	}

	//Metodo que cambia la pass y lleva a listar usuarios
	private void cambiarPass (HttpServletRequest request, HttpServletResponse response) throws Exception{
		try{
			int usuario_id = Integer.parseInt(request.getParameter("usuario_id"));//recojo los parametros del Formulario
			String passVieja=request.getParameter("pass_vieja");//recojo los parametros del Formulario
        	String passNueva=request.getParameter("pass_nueva");//recojo los parametros del Formulario
			if (RolUsuario.Administrador.equals(super.usuarioSesion.getRol())){//si el usuario logueado es Admin entonces no tengo en cuanta la pass antigua
				boolean correcto=Listener.modeloUsuario.cambiarPass(usuario_id, passNueva);//cambio la pass
				if (correcto){//si va bien mando mensaje y voy a listar usuarios
					Mensaje msg = new Mensaje (TipoMensaje.Exito);
					msg.addMensaje("La contraseña se ha modificado correctamente");
					request.setAttribute("msg", msg);
					Logger.getLogger(this.getClass()).info("El usuario: " + super.usuarioSesion.getNombre() + " ha modificado la password del usuario: " + usuario_id);
					if (usuario_id==super.usuarioSesion.getId()){//si se cambia uno mismo la pass entonces se termina sesion y que se vuelva a logeuar. le llevo a fin sesion
						msg.addMensaje("Por motivos de seguridad reinicie la sesión.");
						super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_finSesion"));//Le digo a donde tiene que ir
					}else{
						super.dispatcher= request.getRequestDispatcher("/usuarios");//le digo que vaya a gestionUsuarios, que por defecto es ListarUsuarios
					}
				}else{//si va mal mando mensaje y vuelvo a editar la pass
					Mensaje msg = new Mensaje (TipoMensaje.Error);
					msg.addMensaje("La contraseña no se ha podido modificar");
					request.setAttribute("msg", msg);
					Logger.getLogger(this.getClass()).error("El usuario: " + super.usuarioSesion.getNombre() + " no pudo modificar la password del usuario: " + usuario_id);
					editarPass(request, response, usuario_id);
				}
			}else{//si no es Admin entonces comparo la pass vieja con la nueva.
				String passAntigua = Listener.modeloUsuario.obtenerPass(usuario_id);
				passVieja = Tools.encryptMD5(passVieja);
				if (passVieja.equals(passAntigua)){//si las contraseñas viejas son iguales la cambio
					boolean correcto=Listener.modeloUsuario.cambiarPass(usuario_id, passNueva);//cambio la pass
					if (correcto){//si sale bien mando mensaje y les envio a listarUsuarios
						Mensaje msg = new Mensaje (TipoMensaje.Exito);
						msg.addMensaje("La contraseña se ha modificado correctamente");
						request.setAttribute("msg", msg);
						Logger.getLogger(this.getClass()).info("El usuario: " + super.usuarioSesion.getNombre() + " ha modificado la password del usuario: " + usuario_id);
						//super.dispatcher= request.getRequestDispatcher("/usuarios");//le digo que vaya a gestionUsuarios, que por defecto es ListarUsuarios
						if (usuario_id==super.usuarioSesion.getId()){//si se cambia uno mismo la pass entonces se termina sesion y que se vuelva a logeuar. le llevo a fin sesion
							msg.addMensaje("Por motivos de seguridad reinicie la sesión.");
							super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_finSesion"));//Le digo a donde tiene que ir
						}else{
							super.dispatcher= request.getRequestDispatcher("/usuarios");//le digo que vaya a gestionUsuarios, que por defecto es ListarUsuarios
						}
					}else{//si sasle mal mando mensaje y le llevo otra vez a editar pass
						Mensaje msg = new Mensaje (TipoMensaje.Error);
						msg.addMensaje("La contraseña no se ha podido modificar");
						request.setAttribute("msg", msg);
						Logger.getLogger(this.getClass()).error("El usuario: " + super.usuarioSesion.getNombre() + " no pudo modificar la password del usuario: " + usuario_id);
						editarPass(request, response, usuario_id);
					}
				}else{
					Mensaje msg = new Mensaje (TipoMensaje.Error);
					msg.addMensaje("La contraseña actual no coincide");
					request.setAttribute("msg", msg);
					Logger.getLogger(this.getClass()).error("El usuario: " + super.usuarioSesion.getNombre() + " no pudo modificar la password del usuario: " + usuario_id + "porque no coinciden las contraseñas antiguas.");
					editarPass(request, response, usuario_id);
				}				
			}
        	//super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_detalle_pass"));
			
		}catch (Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada al cambiar una pass");
			throw e;
		}
	}
}
